import java.io.*;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ArquivoImpl extends UnicastRemoteObject implements ArquivoInterface
{
    private String diretorio;
    private Cliente cliente; // Variável do cliente de origem, utilizado para chamar funções do cliente
    /**
    *
    * Função para iniciar o rmi do cliente
    */
    public ArquivoImpl(String diretorioCompartilhado, Cliente cli) throws RemoteException
    {
        super();
        this.diretorio = diretorioCompartilhado;
        this.cliente = cli;
    }
    /**
    *
    * Função para o cliente compartilhar um dos seus ArquivosLocal com outros clientes
    * É utilizada para solicitar o arquivo para leitura ou para escritas
    * Se o responsável for enviado, então a solicitação é para escritas
    */
    public byte[] baixaArquivo(String nomeArquivo, String responsavel)
    {       
            try{
                File file = new File(this.diretorio+ nomeArquivo);
                if(!responsavel.isEmpty()) //solicitaçao para escrita em arquivo
                {
                    // Função do cliente que verifica a disponibilidade do arquivo, e bloqueia caso disponível
                    if(this.cliente.travarArquivo(nomeArquivo))
                    {
                        byte buffer[] = new byte[(int)file.length()];
                        BufferedInputStream input = new BufferedInputStream(new FileInputStream(this.diretorio +nomeArquivo));
                        input.read(buffer, 0, buffer.length);
                        input.close();
                        return(buffer);
                    }
                    return null;
                }                
                else //solicitaçao apenas para leitura
                {
                    byte buffer[] = new byte[(int)file.length()];

                    BufferedInputStream input = new BufferedInputStream(new FileInputStream(this.diretorio +nomeArquivo));

                    input.read(buffer, 0, buffer.length);
                    input.close();
                    return(buffer);
                }
            }catch(FileNotFoundException e)
            {
                System.out.println(e.getMessage());
                e.printStackTrace();
                return null;
            }
            catch(IOException e)
            {
                System.out.println(e.getMessage());
                e.printStackTrace();
                return null;
            }
        
    }

    /**
    *
    * Função para o cliente compartilhar um Arquivos alterado de volta para o cliente de origem
    */   
    public boolean escreveArquivo(String nomeArquivo, byte[] filedata) throws RemoteException
    {
           
        File file = new File(this.diretorio + nomeArquivo);           
        BufferedOutputStream output;
        try {
            output = new BufferedOutputStream(new FileOutputStream(this.diretorio + nomeArquivo));
            output.write(filedata, 0, filedata.length);
            output.flush();
            output.close();            
            //atualiza versao de arquivo no servidor e desbloqueia no cliente de origem
            this.cliente.destravarArquivo(nomeArquivo);
            
            return true;
        } catch (FileNotFoundException ex) 
        {
            Logger.getLogger(ArquivoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ArquivoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return false;
           
    }

}
